;Lo más importante que hay que decir es que traes de memoria 4 pixeles, o sea de a 16 bytes, 
;y procesas de a uno por uno, con el factor que indica en el tp.

;Yo diría algo así: Para cada i, j se calcula el factor coef, que como es un float ocupa 4 bytes,
; o saa 32 bits, se guarda este valor en un xmm*, y se lo shiftea 3 veces de manera de dejarlo
;así xmm3=coef|coef|coef|0.
;De memoria se levantan 4 pixeles, es decir 16 bytes, y se toma de a un pixel 
;(de lo que se levanto), cada uno de estos se guarda en un registro xmm, en el mismo  
;registro se convierte a float cada componente del pixel (quedaría algo así xmm3=r|g|b|a)
;este registro se lo multiplica por xmm3=coef|coef|coef|0.Finalmente, se redondea truncando
;y se acumula el resultado. Se vuelve a repetir el proceso con los 3 pixeles que faltan
;se arregla el registro con los pixeles que no se debían procesar los a y se 
;escribe el destino.


global sierpinski_asm

section .data
ALIGN 16
alpha: db 0,0,0,0xFF,0,0,0,0xFF,0,0,0,0xFF,0,0,0,0xFF
mask: db  0x0,0xFF,0xFF,0xFF,0x1,0xFF,0xFF,0xFF,0x2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
mask2: db 0x0,0x4,0x8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
mask3: dd 255,0,0,0
section .text

;void sierpinski_asm (unsigned char *src,
;                     unsigned char *dst,
;                     int cols, int rows,
;                     int src_row_size,
;                     int dst_row_size)

sierpinski_asm:
;rdi(*src)
;rsi(*dst)
;ecx(cols)
;edx(fils)
;r8d(src_row_size)
;r9d(dst_row_size)
push rbp
mov rbp, rsp
push r12
push r14

%define cols edx
%define fils ecx
%define i r10d
%define j r11d

xor i, i    ;i=0
xor j, j    ;j=0

movdqu xmm15, [mask]
movdqu xmm14, [mask2]
movdqu xmm13, [alpha]
cvtsi2ss xmm10, [mask3]

.cicloFilas:

	cmp i, fils
	je .fin 

	; float frac_1=(((float)i)/filas)*255.0 
        cvtsi2ss xmm0, i
        cvtsi2ss xmm1, fils
        divss xmm0, xmm1
	movdqu xmm1, xmm10
        mulss xmm0, xmm1        ;tengo el primer float en xmm0==frac_1 

	.cicloCols:

                cmp j, cols
                je .finCols

		movdqu xmm6, [rdi]
		movdqu xmm7, xmm6
		xor r14, r14
		pxor xmm5, xmm5
		.cicloAvanzar:

                	cmp r14d, 4
                	je .finCiclo

			;float frac_2=(((float)j)/cols)*255.0
			cvtsi2ss xmm1, j
                	cvtsi2ss xmm2, cols
                	divss xmm1, xmm2
			movdqu xmm2, xmm10
                	mulss xmm1, xmm2 	;tengo el primer float en xmm1==frac_2

			;float coefi=((int)frac_1)^((int)frac_2);
			cvttps2dq xmm11, xmm0
			cvttps2dq xmm12, xmm1
			pxor xmm11, xmm12
			cvtdq2ps xmm1, xmm11	;xmm1=coefi

			;float coef= ((float)coefi)/255.0
			movdqu xmm2, xmm10
			divss xmm1, xmm2   	;xmm1=coef|*|*|*
			pslldq xmm1, 12
			psrldq xmm1, 12         ;xmm1=coef|0|0|0

			pxor xmm3, xmm3		
			por xmm3, xmm1
			pslldq xmm1, 4
			por xmm3, xmm1
			pslldq xmm1, 4	
			por xmm3, xmm1   	;xmm3=coef|coef|coef|0

			movdqu xmm1, xmm6
		
			mov eax, r14d
			shl eax, 2

			cmp eax, 0
			jne .salto1
			psrldq xmm1, 0
			jmp .end
			.salto1:
			cmp eax, 4
			jne .salto2
			psrldq xmm1, 4
			jmp .end
			.salto2:
			cmp eax, 8
                	jne .salto3
			psrldq xmm1, 8
			jmp .end
			.salto3:
			psrldq xmm1, 12

			.end:
		
			pshufb xmm1, xmm15
			cvtdq2ps xmm1, xmm1
			mulps xmm1, xmm3	
			roundps xmm1, xmm1, 3
      			cvtps2dq xmm1, xmm1
			pshufb xmm1, xmm14
		
			cmp eax, 0
                	jne .salto11
                	pslldq xmm1, 0
                	jmp .endd
                	.salto11:
                	cmp eax, 4
                	jne .salto22
                	pslldq xmm1, 4
                	jmp .endd
			.salto22:
                	cmp eax, 8
                	jne .salto33
                	pslldq xmm1, 8
                	jmp .endd
			.salto33: 
                	pslldq xmm1, 12

        		.endd:

			por xmm5, xmm1
			inc r14d
			inc j
			jmp .cicloAvanzar

		.finCiclo:

		pand xmm7, xmm13
		por xmm5, xmm7
		movdqu [rsi], xmm5
		add rdi, 16
		add rsi, 16

		jmp .cicloCols		

.finCols:


	xor rax, rax
	mov eax, r8d
	mov r12d, cols
	shl r12d, 2
	sub eax, r12d
	add rdi, rax

	xor rax, rax
	mov eax, r9d
	sub eax, r12d
	add rsi, rax 	
	
	xor j, j
	inc  i
	jmp .cicloFilas	

.fin:
		pop r14
		pop r12
		pop rbp	
		ret



